package own.stu.jobgib.playown.alg.leetcode.editor.cn;

//在一个仓库里，有一排条形码，其中第 i 个条形码为 barcodes[i]。 
//
// 请你重新排列这些条形码，使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案，此题保证存在答案。 
//
// 
//
// 示例 1： 
//
// 输入：[1,1,1,2,2,2]
//输出：[2,1,2,1,2,1]
// 
//
// 示例 2： 
//
// 输入：[1,1,1,1,2,2,3,3]
//输出：[1,3,1,3,2,1,2,1] 
//
// 
//
// 提示： 
//
// 
// 1 <= barcodes.length <= 10000 
// 1 <= barcodes[i] <= 10000 
// 
//
// 
// Related Topics 堆 排序 
// 👍 61 👎 0


import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;

import static own.stu.jobgib.playown.util.PrintUtil.printArray;

public class DistantBarcodes{
    public static void main(String[] args) {
        Solution solution = new DistantBarcodes().new Solution();
//        printArray(solution.rearrangeBarcodes(new int[] {1,1,1,2,2,2}));
//        System.out.println();
//        printArray(solution.rearrangeBarcodes(new int[] {1,1,1,1,2,2,3,3}));
//        System.out.println();
        printArray(solution.rearrangeBarcodes(new int[] {1,1,2}));
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int[] rearrangeBarcodes(int[] barcodes) {
            if(barcodes == null || barcodes.length <= 2){
                return barcodes;
            }
            int len = barcodes.length;
            int[] ans = new int[len];
            // 1: count
            Map<Integer, Integer> map = new HashMap<>();
            for(int i : barcodes){
                map.put(i, map.getOrDefault(i, 0) + 1);
            }

            // 2: compare
            PriorityQueue<Map.Entry<Integer, Integer>> maxHeap = new PriorityQueue<>((a, b) ->b.getValue() - a.getValue());
            for(Map.Entry<Integer, Integer> entry : map.entrySet()){
                maxHeap.add(entry);
            }

            // 3: 双指针赋值
            int i = -2, j = -1;
            while (!maxHeap.isEmpty()){
                Map.Entry<Integer, Integer> tmp = maxHeap.poll();
                for(int k = 0; k < tmp.getValue(); k ++ ){
                    if(i + 2 < len){
                        ans[i + 2] = tmp.getKey();
                        i += 2;
                    }else{
                        ans[j + 2] = tmp.getKey();
                        j += 2;
                    }
                }
            }

            return ans;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}
